package com.xunge.controller;

import com.xunge.anno.Log;
import com.xunge.mapper.CourseMapper;
import com.xunge.pojo.Course;
import com.xunge.pojo.CourseQueryParam;
import com.xunge.pojo.PageResult;
import com.xunge.pojo.Result;
import com.xunge.service.CourseService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.ArrayList;
import java.util.List;

@Slf4j
@RequestMapping("/courses")
@RestController
public class CourseController {
    @Autowired
    private CourseService courseService;
    @Autowired
    private CourseMapper courseMapper;

    /**
     * 分页查询课程信息
     *
     * @param courseQueryParam 分页查询参数，包含页码、每页条数等信息
     * @return 返回分页结果，包含课程信息列表和分页相关数据
     */
    @GetMapping
    public Result page(CourseQueryParam courseQueryParam){
        // 记录分页查询请求参数的日志
        log.info("分页请求参数:{}" ,courseQueryParam);

        // 调用服务层方法执行分页查询，并返回查询结果
        PageResult<Course> pageResult = courseService.page(courseQueryParam);
        return Result.success(pageResult);
    }

    /**
     * 保存课程信息
     *
     * @param course 待保存的课程信息，包括课程的基本数据
     * @return 返回保存结果，成功则返回成功信息
     */
    @Log
    @PostMapping
    public Result save(@RequestBody Course course){
        // 记录保存课程信息请求的日志
        log.info("保存信息：{}",course);

        // 检查课程名称是否重复（排除当前记录）
        if (courseService.isNameExists(course.getName(), null)) {
          return Result.error("课程名称【" + course.getName() + "】已存在，请重新输入");
      }
      // 检查课程代码是否重复（排除当前记录）
      if (courseService.isCodeExists(course.getCode(), null)) {
          return Result.error("课程代码【" + course.getCode() + "】已存在，请重新输入");
      }
        courseService.save(course);
        return Result.success();
    }

    /**
     * 批量删除课程信息
     *
     * @param ids 需要删除的课程ID列表
     * @return 返回删除结果，成功则返回成功信息
     */
    @Log
    @DeleteMapping
    public Result delete(@RequestParam("ids") List<Integer> ids){
        // 记录批量删除请求的日志
        log.info("根据ID批量删除课程信息: {}",ids);

        return courseService.delete(ids);
    }

    /**
     * 根据ID查询课程信息
     *
     * @param id 需要查询的课程ID
     * @return 返回查询结果，包括课程的详细信息
     */
    @GetMapping("/{id}")
    public Result getInfo(@PathVariable Integer id){
        // 记录根据ID查询课程信息请求的日志
        log.info("根据ID查询课程信息: {}",id);
        // 调用服务层方法根据ID查询课程信息
        Course course = courseService.getById(id);
        return Result.success(course);
    }

    /**
     * 根据ID修改课程信息
     *
     * @param course 包含需要更新的课程信息，包括课程ID和修改后的数据
     * @return 返回修改结果，成功则返回成功信息
     */
    @Log
    @PutMapping
    public Result update(@RequestBody Course course){
        // 记录根据ID修改课程信息请求的日志
        log.info("根据ID修改课程信息：{}",course);
        // 检查课程名称是否重复（排除当前记录）
        if (courseService.isNameExists(course.getName(), course.getId())) {
            return Result.error("课程名称【" + course.getName() + "】已存在，请重新输入");
        }
        // 检查课程代码是否重复（排除当前记录）
        if (courseService.isCodeExists(course.getCode(), course.getId())) {
            return Result.error("课程代码【" + course.getCode() + "】已存在，请重新输入");
        }
        courseService.update(course);
        return Result.success();
    }

    /**
     * 查询所有课程信息
     *
     * @return 返回所有课程信息列表
     */
    @GetMapping("/list")
    public Result list(){
        // 记录查询所有课程信息请求的日志
        log.info("查询所有课程信息");
        // 调用服务层方法查询所有课程信息
        List<Course> courseList = courseService.listAll();
        return Result.success(courseList);
    }


} 